# frozen_string_literal: true

module Jobs
  class ProcessSnsNotification < ::Jobs::Base
    sidekiq_options retry: false

    def execute(args)
      return unless raw = args[:raw].presence
      return unless json = args[:json].presence
      return unless message = json["Message"].presence

      message =
        begin
          JSON.parse(message)
        rescue JSON::ParserError
          nil
        end

      return unless message && message["notificationType"] == "Bounce"
      return unless message_id = message.dig("mail", "messageId").presence
      return unless bounce_type = message.dig("bounce", "bounceType").presence

      require "aws-sdk-sns"
      return unless Aws::SNS::MessageVerifier.new.authentic?(raw)

      message
        .dig("bounce", "bouncedRecipients")
        .each do |r|
          if email_log =
               EmailLog.order("created_at DESC").where(to_address: r["emailAddress"]).first
            email_log.update_columns(bounced: true, bounce_error_code: r["status"])

            if email_log.user&.email.present?
              if email_log.user.user_stat.bounce_score.to_s.start_with?("4.") ||
                   bounce_type == "Transient"
                Email::Receiver.update_bounce_score(
                  email_log.user.email,
                  SiteSetting.soft_bounce_score,
                )
              else
                Email::Receiver.update_bounce_score(
                  email_log.user.email,
                  SiteSetting.hard_bounce_score,
                )
              end
            end
          end
        end
    end
  end
end
